#! /usr/bin/env python
# -*- coding:utf-8 -*-

dict

# 方式1 传入元祖，元祖里面元素就是元祖
dic = dict((('messi', 1), ('ronald', 2), ('herry', 3), ('kaka', 4)))
print(dic)  # {'messi': 1, 'ronald': 2, 'herry': 3, 'kaka': 4}
# 方式2 通过key-value对
dic2 = dict(messi=1, ronald=2, herry=3, kaka=4)
print(dic2)
# 方式3 直接传入
dic3 = dict({'messi': 1, 'ronald': 2, 'herry': 3, 'kaka': 4})
print(dic3)

# 验证字典的合法性
# 让key为list
# dic={[1,2,3]:"messi"} # 运行报错提示 TypeError: unhashable type: 'list'
# print(dic)

# 字典的增删改查
# 1 增
dic = {1: 'messi', 2: 'ronald', 3: 'herry'}  # 键必须唯一，不可变
print(dic)
# 增加
dic[4] = 'kaka'
print(dic)
# 再赋值，就变成了修改，所以是有则改，无则增
dic[4] = 'zidane'
print(dic)
# setdefault方法，有key-value则不变，无则增加，没给定value就是None
dic.setdefault(5)
print(dic)  # {1: 'messi', 2: 'ronald', 3: 'herry', '4': 'zidane', '5': None}
dic.setdefault(6, 'becham')
print(dic)
dic.setdefault(6)
print(dic)

# 2 删除
# 按照key来删除
r = dic.pop(1)  # 将被删除的值返回
print(r)
print(dic)

# 如果不确定是否有key，为防止没有key删除报错，可以给定第二个参数
r = dic.pop(8, "没有这个值")
print(r)
print(dic)

# clear 清空内容
# dic.clear()
# print(dic)

# del 如果没有这个key，del会报错
del dic[2]
print(dic)

# 3 改
dic[5] = 'Ronaldinho'
print(dic)

# 4 查
# 普通的根据key来查，这种方法如果key不存在容易报错
print(dic[3])
# print(dic[7]) # KeyError: 7

# 可以使用get来查，不容易报错
print(dic.get(3))
print(dic.get(7))  # None
print(dic.get(7, "没有这个key，你个饿货"))

# 字典里有keys、values和items的方法，scala中的映射map，也有对keys和values方法
print(dic.keys(), type(dic.keys()))  # dict_keys([3, 4, 5, 6]) <class 'dict_keys'>
print(dic.values(),type(dic.values()))  # dict_values(['herry', 'zidane', 'Ronaldinho', 'becham']) <class 'dict_values'>

# 可以循环遍历
for key in dic.keys():
    print(key)

# 可以转换为列表
r = dic.keys()
print(list(r))

# key-value对
for i in dic.items():
    print(i)

# 上面的i，其实就是一个元祖，可以拆包
for k, v in dic.items():
    print(k, v)

# 面试题 替换下面两个数
a = 18
b = 12

a, b = b, a  # a,b=12,18 变量的重新赋值
print(a, b)

# 练习
dic = {'k1': 'v1', 'k2': 'v2', 'k3': [11, 22, 33]}
# 请在字典中添加一个键值对'k4':'v4'，输出添加后的字典
print(dic)
dic['k4'] = 'v4'
print(dic)
# 修改字典中k1对应的值为'alex'，输出修改后的字典
dic['k1'] = 'alex'
print(dic)
# 在k3对应的值中追加一个元素44，输出修改后的字典
# dic['k3'].append(44)
dic.get('k3').append(44)
print(dic)
# 在k3对应的值的第一个位置插入元素18，输出修改后的字典
dic['k3'].insert(0, 18)
print(dic)
